package br.com.unioConci.upload.negocio;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;

import br.com.r2.exception.R2Exception;
import br.com.r2.util.hibernate.business.NegocioThrow;
import br.com.r2.util.hibernate.business.R2HbNgc;
import br.com.r2.util.hibernate.business.RestritorHb;
import br.com.unioConci.upload.vo.ArquivoFinanceiroAnaliticoVo;
import br.com.unioConci.util.hibernate.business.HibernateUtil;

public class ArquivoFinanceiroAnaliticoNgc extends R2HbNgc<ArquivoFinanceiroAnaliticoVo>
{

   private Map filtroPropriedade = new HashMap();

   private Map restritores = new HashMap();

   public static final int JOIN_LOCAL_PAGAMENTO = 1;

   public static final int JOIN_USUARIO_INCLUSAO = 2;

   public static final int JOIN_USUARIO_CONCILIACAO = 4;
   
   private static ArquivoFinanceiroAnaliticoNgc instancia = null;
   
   private ArquivoFinanceiroAnaliticoNgc()
   {
      init(restritores, filtroPropriedade, ArquivoFinanceiroAnaliticoVo.class);
      addFiltro("dataInclusao", RestritorHb.RESTRITOR_DATA_INICIAL, "filtro.dataInclusaoInicial.dataHora");
      addFiltro("dataInclusao", RestritorHb.RESTRITOR_DATA_FINAL, "filtro.dataInclusaoFinal.dataHora");
      addFiltro("dataConciliacao", RestritorHb.RESTRITOR_DATA_INICIAL, "filtro.dataConciliacaoInicial.dataHora");
      addFiltro("dataConciliacao", RestritorHb.RESTRITOR_DATA_FINAL, "filtro.dataConciliacaoFinal.dataHora");
      addFiltro("dataBaixa", RestritorHb.RESTRITOR_DATA_INICIAL, "filtro.dataBaixaInicial");
      addFiltro("dataBaixa", RestritorHb.RESTRITOR_DATA_FINAL, "filtro.dataBaixaFinal");
      addFiltro("nomeCliente", RestritorHb.RESTRITOR_LIKE, "nomeCliente");
      addFiltro("localPagamento.codigo", RestritorHb.RESTRITOR_EQ, "localPagamentoVo.codigo");
      addFiltro("usuarioInclusao.codigo", RestritorHb.RESTRITOR_EQ, "usuarioInclusaoVo.codigo");
      addFiltro("usuarioConciliacao.codigo", RestritorHb.RESTRITOR_EQ, "usuarioConciliacaoVo.codigo");
   }

   public static ArquivoFinanceiroAnaliticoNgc getInstancia()
   {
      if (instancia == null)
      {
         instancia = new ArquivoFinanceiroAnaliticoNgc();
      }
      return instancia;
   }
   
   @Override
   protected Criteria montaCriteria(Session session, int join)
   {
      Criteria criteria = session.createCriteria(ArquivoFinanceiroAnaliticoVo.class);
      if ((join & JOIN_LOCAL_PAGAMENTO) != 0)
      {
         criteria.createCriteria("localPagamentoVo", "localPagamento", Criteria.INNER_JOIN);
      }
      if ((join & JOIN_USUARIO_INCLUSAO) != 0)
      {
         criteria.createCriteria("usuarioInclusaoVo", "usuarioInclusao", Criteria.INNER_JOIN);
      }
      if ((join & JOIN_USUARIO_CONCILIACAO) != 0)
      {
         criteria.createCriteria("usuarioConciliacaoVo", "usuarioConciliacao", Criteria.LEFT_JOIN);
      }

      return criteria;
   }
   
   @Override
   protected void setarOrdenacao(Criteria criteria, ArquivoFinanceiroAnaliticoVo filter, int join)
   {
      if ((join & JOIN_LOCAL_PAGAMENTO) != 0)
      {
         criteria.addOrder(Order.asc("localPagamento.descricao"));
      }
      criteria.addOrder(Order.asc("dataBaixa"));
      criteria.addOrder(Order.asc("nomeCliente"));
   }

   public void atualizar(List<ArquivoFinanceiroAnaliticoVo> listaConciliacoes) throws R2Exception
   {
      Session sessao = HibernateUtil.getSession();
      sessao.setFlushMode(FlushMode.COMMIT);
      Transaction tx = sessao.beginTransaction();
      try
      {
         this.atualizar(sessao, listaConciliacoes);
         tx.commit();
      }
      catch (Exception e)
      {
         throw NegocioThrow.getInstancia().catchHBEdicaoSession(e, tx);
      }
      finally
      {
         sessao.close();
      }
   }

   public void atualizar(Session sessao, List<ArquivoFinanceiroAnaliticoVo> listaConciliacoes) throws R2Exception
   {
      if (listaConciliacoes == null || listaConciliacoes.size() <= 0)
      {
         throw new R2Exception("campo.obrigatorio.atualizar");
      }
      
      Iterator<ArquivoFinanceiroAnaliticoVo> iterator = listaConciliacoes.iterator();
      while (iterator.hasNext())
      {
         ArquivoFinanceiroAnaliticoVo element = (ArquivoFinanceiroAnaliticoVo) iterator.next();
         this.alterar(sessao, element);
      }
   }

   @Override
   protected Map filtroPropriedade()
   {
      return filtroPropriedade;
   }
   
   @Override
   protected Map restritores()
   {
      return restritores;
   }


}
